/*
 * uart.c
 *
 *  Created on: Jul 11, 2021
 *      Author: 本地账户
 */

#include "uart.h"
#include "delay.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "Remote.h"
#include "openmv.h"
#include "FreeRTOS.h"
#include "task.h"
#include "cmsis_os.h"
#include "iwdg.h"
#include "jy61.h"

//////////////////////////////////////////////////////////////////////////////////
//如果使用os,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//os 使用
#endif
//////////////////////////////////////////////////////////////////////////////////

//加入以下代码,支持printf函数,而不需要选择use MicroLIB
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
	int handle;
};

FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
	x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
	USART1->DR = (u8) ch;
	return ch;
}
#endif

#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART1_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
u8 USART2_RX_BUF[USART_REC_LEN];
u8 USART3_RX_BUF[USART_REC_LEN];
u8 UART4_RX_BUF[USART_REC_LEN];
u8 UART5_RX_BUF[USART_REC_LEN];

//接收状态
//bit15，	接收完成标志
//bit14，	接收到0x0d
//bit13~0，	接收到的有效字节数目


u16 USART1_RX_STA=0;   //接收状态标记
u16 USART2_RX_STA=0;
u16 USART3_RX_STA=0;
u16 UART4_RX_STA=0;
u16 UART5_RX_STA=0;

u8 aRxBuffer1[RXBUFFERSIZE];//HAL库使用的串口接收缓冲
u8 aRxBuffer2[RXBUFFERSIZE];
u8 aRxBuffer3[RXBUFFERSIZE];
u8 aRxBuffer4[RXBUFFERSIZE];
u8 aRxBuffer5[RXBUFFERSIZE];

extern u8 uflag;

#endif

//以下四个串口句柄在main函数中定义
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
extern UART_HandleTypeDef huart3;
extern UART_HandleTypeDef huart4;
extern UART_HandleTypeDef huart5;

extern osSemaphoreId myBinarySem01Handle;


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	BaseType_t xHigherPriorityTaskWoken;
	if(huart->Instance==USART1)//如果是串口1
	{
		if((USART1_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART1_RX_STA&0x4000)//接收到了0x0d
			{
				if(aRxBuffer1[0]!=0x0a)
					USART1_RX_STA=0;//接收错误,重新开始
				else
					USART1_RX_STA|=0x8000;	//接收完成了
			}
			else //还没收到0X0D
			{
				if(aRxBuffer1[0]==0x0d)
					USART1_RX_STA|=0x4000;
				else
				{
					USART1_RX_BUF[USART1_RX_STA&0X3FFF]=aRxBuffer1[0] ;
					USART1_RX_STA++;
					if(USART1_RX_STA>(USART_REC_LEN-1))
						USART1_RX_STA=0;//接收数据错误,重新开始接收
				}
			}
		}

	}
	else if (huart->Instance==USART2) ////如果是串口2
	{
			receive_control_datas(huart);
	}
	else if (huart->Instance==USART3)
	{
		//receive_control_datas(huart);
	}
	else if (huart->Instance==UART4)
	{
		if((UART4_RX_STA&0x8000)==0)
		{
			UART4_RX_BUF[UART4_RX_STA&0X3FFF]=aRxBuffer4[0];
			UART4_RX_STA++;

			if(UART4_RX_STA>=3)
			{
				if(UART4_RX_BUF[2]==0x5A||UART4_RX_BUF[2]==0x18||UART4_RX_BUF[2]==0x52||UART4_RX_BUF[2]==0x08)
					{
						MX_IWDG_Init();
					}
				if (uflag!=1)
					UART4_RX_STA|=0x8000;
				else
					UART4_RX_STA=0;
			}
		}
		HAL_UART_Receive_IT(&huart4, (uint8_t *)aRxBuffer4, 1);
	}
	else if (huart->Instance==UART5)
	{
		receive_openmv_data(huart);
		//receive_jy61_data(huart);
	}
	else if (huart->Instance==USART6)
	{
		receive_jy61_data(huart);
	}
}





